package cn.net.autocode.maths;

import java.math.BigDecimal;

/**
 * 根据修约规则，对数据进行修约，在LIMS项目中有应用
 *
 */
public class RoundRule {

	/**
	 * @param ptype 修约类型
	 * @param nc 精度
	 * @param result 原始值
	 * ROUND_UP: 进位法
	 * ROUND_DOWN : 去位法
	 * ROUND_HALF_UP: 四舍五入
	 * ROUND_HALF_DOWN: 五舍六入
	 * ROUND_HALF_EVEN：四舍六入五成双
	 * 有效位数、0.5法、0.2法 
	 * ROUND_CEILING：接近正无穷大舍入模式
	 * ROUND_FLOOR：接近负无穷大舍入模式
	 * @return 修约值
	 */
	public static String round(String ptype,String nc,String result) {
		String nr = result;
		switch(ptype) {
			case "进位法":
				nr = RoundRule.ROUND_UP(nc, result);
				break;
			case "去位法":
				nr = RoundRule.ROUND_DOWN(nc, result);
				break;
			case "0.5法":
				nr = RoundRule.ROUND_HALF(nc, result);
				break;
			case "0.5":
				nr = RoundRule.ROUND_HALF(nc, result);
				break;
		}
		return nr;
	}
	
	/**
	 * 1、进位法
	 * @param nc 精度
	 * @param result 原始值
	 * @return 修约值
	 */
	private static String ROUND_UP(String nc,String result) {
		try {
			int jd = Integer.valueOf(nc);
			BigDecimal or = new BigDecimal(result);
			return or.setScale(jd, BigDecimal.ROUND_UP).toString();
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			return result;
		}
		
	}
	
	/**
	 * 2、去位法
	 * @param nc 精度
	 * @param result 原始值
	 * @return 修约值
	 */
	private static String ROUND_DOWN(String nc,String result) {
		try {
			int jd = Integer.valueOf(nc);
			BigDecimal or = new BigDecimal(result);
			return or.setScale(jd, BigDecimal.ROUND_DOWN).toString();
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			return result;
		}
	}
	
	/**
	 * 0.5法
	 * @param nc 精度
	 * @param result 原始值
	 * @return 修约值
	 */
	private static String ROUND_HALF(String nc,String result) {
		try {
			int jd = Integer.valueOf(nc);
			BigDecimal or = new BigDecimal(result);
			BigDecimal cs = new BigDecimal(10);
			for(int i=0;i<jd;i++) {
				cs = cs.multiply(new BigDecimal(10));
			}
			
			BigDecimal mr = or.multiply(cs).setScale(0, BigDecimal.ROUND_DOWN);
			BigDecimal[] ys = mr.divideAndRemainder(new BigDecimal(100));
			
			if(ys[1].compareTo(new BigDecimal(75))>=0) {
				return ys[0].multiply(new BigDecimal(100)).add(new BigDecimal(100)).divide(cs).setScale(jd).toString();
			}else if(ys[1].compareTo(new BigDecimal(25))<=0) {
				return ys[0].multiply(new BigDecimal(100)).divide(cs).setScale(jd).toString();
			}else {
				return ys[0].multiply(new BigDecimal(100)).add(new BigDecimal(50)).divide(cs).setScale(jd).toString();
			}
			
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			return result;
		}
	}
}
